package com.demo.staticdemo;

/**
 * @Description: Java 中的 static 使用之静态初始化块
 * 1.在类的声明中，可以包含多个初始化块，当创建类的实例时，就会依次执行这些代码块;
 * 如果使用 static 修饰初始化块，就称为静态初始化块。
 * 2.静态初始化块只在类加载时执行，且只会执行一次;
 * 同时静态初始化块只能给静态变量赋值，不能初始化普通的成员变量。
 * 3.程序运行的时候静态初始化快最先被执行,然后执行普通初始化块,最后执行构造方法;
 * 静态初始化块只在类加载时执行一次。
 * @Author: xiangty
 * @Date: 2018-03-20
 */
public class LearnJava3 {
    String temp1;
    String temp2;
    static String temp3;

    /**
     * 构造方法
     */
    public LearnJava3() {
        temp1 = "temp1变量值";
        System.out.println("通过构造方法给temp1赋值");
    }

    /**
     * 初始化代码块
     */
    {
        temp2 = "temp2变量值";
        System.out.println("通过初始化代码块给temp2赋值");
    }

    static {
        temp3 = "temp3变量值";
        System.out.println("通过静态代码块给temp3赋值");
    }

    @SuppressWarnings("unused")
	public static void main(String[] args) {
        LearnJava3 tempObject1 = new LearnJava3();
        System.out.println("temp1:---" + tempObject1.temp1);
        System.out.println("temp2:---" + tempObject1.temp2);
        System.out.println("temp3:---" + temp3);

        LearnJava3 tempObject2 = new LearnJava3();
    }

    /**
     * 输出内容:
     *
     * 通过静态代码块给temp3赋值
     * 通过初始化代码块给temp2赋值
     * 通过构造方法给temp1赋值
     * temp1:---temp1变量值
     * temp2:---temp2变量值
     * temp3:---temp3变量值
     * 通过初始化代码块给temp2赋值
     * 通过构造方法给temp1赋值
     *
     * -------------------------------
     * 程序运行的时候静态初始化快最先被执行,然后执行普通初始化块,最后执行构造方法.
     * 由于静态初始化块只在类加载时执行一次,所以创建tempObject2对象的时候并没有执行静态初始化块.
     */
}
